home *** CD-ROM | disk | FTP | other *** search
/ Team Palmtops 7 / Palmtops_numero07.iso / WinCE / SDKWindowsCE / HandHeldPCPro30 / sdk.exe / Jupiter SDK / data1.cab / MFC_Samples / wcedbtst / wcedbdoc.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1999-02-19  |  15.8 KB  |  710 lines

  1. // WCE_DatabaseDoc.cpp : implementation of the CWCEDBDoc class
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. #include "wcedbtst.h"
  7. #include "wcedbdoc.h"
  8.  
  9.  
  10. // Define app-defined values
  11. const DWORD DB_IDENT_PEOPLE  = 12345;
  12. const WCHAR DB_NAME_PEOPLE[] = _T("People");
  13. const WORD  PROP_LASTNAME    = 101,  
  14.             PROP_FIRSTNAME   = 102,  
  15.             PROP_AGE         = 103,   
  16.             PROP_GENDER      = 104; 
  17.  
  18.  
  19.  
  20. #ifdef _DEBUG
  21. #define new DEBUG_NEW
  22. #undef THIS_FILE
  23. static char THIS_FILE[] = __FILE__;
  24. #endif
  25.  
  26. /////////////////////////////////////////////////////////////////////////////
  27. // CWCEDBDoc
  28.  
  29. IMPLEMENT_DYNCREATE(CWCEDBDoc, CDocument)
  30.  
  31. BEGIN_MESSAGE_MAP(CWCEDBDoc, CDocument)
  32.     //{{AFX_MSG_MAP(CWCEDBDoc)
  33.     ON_COMMAND(ID_FILE_BASICTESTS, OnFileBasicTests)
  34.     ON_COMMAND(ID_FILE_ENUM, OnFileEnum)
  35.     ON_COMMAND(ID_FILE_SORTTEST, OnFileSortTest)
  36.     ON_COMMAND(ID_FILE_SEEKTEST, OnFileSeekTest)
  37.     ON_COMMAND(ID_FILE_DELETIONTEST, OnFileDeletionTest)
  38.     ON_COMMAND(ID_FILE_MODIFYTEST, OnFileModifyTest)
  39.     //}}AFX_MSG_MAP
  40. END_MESSAGE_MAP()
  41.  
  42. /////////////////////////////////////////////////////////////////////////////
  43. // CWCEDBDoc construction/destruction
  44.  
  45. CWCEDBDoc::CWCEDBDoc()
  46. {
  47. }
  48.  
  49. CWCEDBDoc::~CWCEDBDoc()
  50. {
  51.     if(CCeDBDatabase::Exists(DB_NAME_PEOPLE)) 
  52.     {
  53.         CCeDBDatabase db;
  54.         db.Open(DB_NAME_PEOPLE);
  55.         db.Delete();
  56.     }
  57. }
  58.  
  59. BOOL CWCEDBDoc::OnNewDocument()
  60. {
  61.     if (!CDocument::OnNewDocument())
  62.         return FALSE;
  63.  
  64.     return TRUE;
  65. }
  66.  
  67.  
  68. /////////////////////////////////////////////////////////////////////////////
  69. // CWCEDBDoc serialization
  70.  
  71. void CWCEDBDoc::Serialize(CArchive& ar)
  72. {
  73.     if (ar.IsStoring())
  74.     {
  75.     }
  76.     else
  77.     {
  78.     }
  79. }
  80.  
  81. /////////////////////////////////////////////////////////////////////////////
  82. // CWCEDBDoc diagnostics
  83.  
  84. #ifdef _DEBUG
  85. void CWCEDBDoc::AssertValid() const
  86. {
  87.     CDocument::AssertValid();
  88. }
  89.  
  90. void CWCEDBDoc::Dump(CDumpContext& dc) const
  91. {
  92.     CDocument::Dump(dc);
  93. }
  94. #endif //_DEBUG
  95.  
  96. /////////////////////////////////////////////////////////////////////////////
  97. // CWCEDBDoc commands
  98.  
  99. // Need to figure out error values
  100. #define FAIL_AND_EXIT { Output.Add(CString((LPCTSTR)IDS_FAILEXIT)),UpdateAllViews(NULL); return; }
  101. #define FAIL Output.Add(CString((LPCTSTR)IDS_FAILED)),UpdateAllViews(NULL)
  102. #define OK   Output.Add(CString((LPCTSTR)IDS_OK)),UpdateAllViews(NULL)
  103. #define PRINT(what) Output.Add(CString((LPCTSTR)what)),UpdateAllViews(NULL)
  104. #define PRINT_BLANK() Output.Add(_T("")),UpdateAllViews(NULL)
  105. #define PRINT_WSTR(what) Output.Add(what),UpdateAllViews(NULL)
  106. #define START {Output.RemoveAll(); \
  107.               POSITION pos = GetFirstViewPosition(); \
  108.               GetNextView(pos)->SetScrollPos(SB_VERT,0);\
  109.               UpdateAllViews(NULL); }
  110.  
  111.  
  112. BOOL CWCEDBDoc::GeneratePeopleDB() 
  113. {
  114.     PRINT(IDS_GENERATE_PEOPLE);
  115.     PRINT(IDS_SORT_ORDER); 
  116.  
  117.     // Delete old database if existent
  118.     if(CCeDBDatabase::Exists(DB_NAME_PEOPLE)) 
  119.     {
  120.         CCeDBDatabase db;
  121.         db.Open(DB_NAME_PEOPLE);
  122.         if(!db.Delete())
  123.             return FALSE;
  124.     }
  125.  
  126.     // Create database
  127.     CCeDBDatabase db;
  128.     CEOID poid;  
  129.     CCeDBProp SortProps[3] = {
  130.         CCeDBProp(CCeDBProp::Type_String, PROP_LASTNAME,
  131.                    CCeDBProp::Sort_Ascending | CCeDBProp::Sort_CaseInsensitive),
  132.         CCeDBProp(CCeDBProp::Type_UShort, PROP_AGE,      
  133.                    CCeDBProp::Sort_Descending),
  134.         CCeDBProp(CCeDBProp::Type_UShort, PROP_GENDER,   
  135.                    CCeDBProp::Sort_UnknownFirst) 
  136.     };
  137.  
  138.     if(!(poid = db.Create(DB_NAME_PEOPLE,DB_IDENT_PEOPLE,3,SortProps))) 
  139.         return FALSE;
  140.  
  141.     if(!db.Open(poid))
  142.         return FALSE;
  143.  
  144.     // Add records
  145.     CCeDBRecord rec;
  146.     CCeDBProp props[4];
  147.  
  148.     CString str;
  149.  
  150.     str.LoadString(IDS_SMITH);
  151.     props[0] = CCeDBProp((LPWSTR)(LPCTSTR)str,PROP_LASTNAME);
  152.     str.LoadString(IDS_BOB);
  153.     props[1] = CCeDBProp((LPWSTR)(LPCTSTR)str,  PROP_FIRSTNAME);
  154.     props[2] = CCeDBProp((USHORT)34, PROP_AGE);
  155.     props[3] = CCeDBProp((USHORT)'M',PROP_GENDER);
  156.     rec.AddProps(props,4);
  157.     if(!db.AddRecord(&rec))
  158.         return FALSE;
  159.  
  160.     rec.DeleteAllProps();
  161.     str.LoadString(IDS_SMITH);
  162.     props[0] = CCeDBProp((LPWSTR)(LPCTSTR)str,PROP_LASTNAME);
  163.     str.LoadString(IDS_MARY);
  164.     props[1] = CCeDBProp((LPWSTR)(LPCTSTR)str, PROP_FIRSTNAME);
  165.     props[2] = CCeDBProp((USHORT)22, PROP_AGE);
  166.     props[3] = CCeDBProp((USHORT)'F',PROP_GENDER);
  167.     rec.AddProps(props,4);
  168.     if(!db.AddRecord(&rec))
  169.         return FALSE;
  170.  
  171.     rec.DeleteAllProps();
  172.     str.LoadString(IDS_EMERSON);
  173.     props[0] = CCeDBProp((LPWSTR)(LPCTSTR)str,PROP_LASTNAME);
  174.     str.LoadString(IDS_RALPH);
  175.     props[1] = CCeDBProp((LPWSTR)(LPCTSTR)str, PROP_FIRSTNAME);
  176.     props[2] = CCeDBProp((USHORT)65, PROP_AGE);
  177.     props[3] = CCeDBProp((USHORT)'M',PROP_GENDER);
  178.     rec.AddProps(props,4);
  179.     if(!db.AddRecord(&rec))
  180.         return FALSE;
  181.  
  182.     rec.DeleteAllProps();
  183.     str.LoadString(IDS_CABANA);
  184.     props[0] = CCeDBProp((LPWSTR)(LPCTSTR)str,PROP_LASTNAME);
  185.     str.LoadString(IDS_ANNA);
  186.     props[1] = CCeDBProp((LPWSTR)(LPCTSTR)str, PROP_FIRSTNAME);
  187.     props[2] = CCeDBProp((USHORT)19, PROP_AGE);
  188.     props[3] = CCeDBProp((USHORT)'F',PROP_GENDER);
  189.     rec.AddProps(props,4);
  190.     if(!db.AddRecord(&rec))
  191.         return FALSE;
  192.  
  193.     rec.DeleteAllProps();
  194.     str.LoadString(IDS_ZIMMERMAN);
  195.     props[0] = CCeDBProp((LPWSTR)(LPCTSTR)str,PROP_LASTNAME);
  196.     str.LoadString(IDS_ZACH);
  197.     props[1] = CCeDBProp((LPWSTR)(LPCTSTR)str, PROP_FIRSTNAME);
  198.     props[2] = CCeDBProp((USHORT)25, PROP_AGE);
  199.     props[3] = CCeDBProp((USHORT)'M',PROP_GENDER);
  200.     rec.AddProps(props,4);
  201.     if(!db.AddRecord(&rec))
  202.         return FALSE;
  203.  
  204.     // Write a partial record (an unknown gender)
  205.     rec.DeleteAllProps();
  206.     str.LoadString(IDS_EVANS);
  207.     props[0] = CCeDBProp((LPWSTR)(LPCTSTR)str,PROP_LASTNAME);
  208.     str.LoadString(IDS_PAT);
  209.     props[1] = CCeDBProp((LPWSTR)(LPCTSTR)str, PROP_FIRSTNAME);
  210.     props[2] = CCeDBProp((USHORT)41, PROP_AGE);
  211.     props[3] = CCeDBProp((USHORT)'F',PROP_GENDER);
  212.     rec.AddProps(props,4);
  213.     // We added the last prop so we can test deletion
  214.     rec.DeleteProp(PROP_GENDER);
  215.     if(!db.AddRecord(&rec))
  216.         return FALSE;
  217.  
  218.     return TRUE;
  219. }
  220.  
  221.  
  222. BOOL CWCEDBDoc::PrintPeopleDB(CCeDBDatabase *pdb) 
  223. {
  224.     PRINT(IDS_PRINT_PEOPLE);
  225.  
  226.     CCeDBRecord rec;
  227.  
  228.     WCHAR szBuf[100];
  229.     CString str;
  230.     str.LoadString(IDS_NUM_RECORD);
  231.     wsprintf(szBuf,(LPCTSTR)str,pdb->GetNumRecords());
  232.     PRINT_WSTR(szBuf);
  233.  
  234.     BOOL bPrev = pdb->m_bAutoSeekNext;
  235.     pdb->m_bAutoSeekNext = TRUE;
  236.     pdb->SeekFirst();
  237.     while(pdb->ReadCurrRecord(&rec))
  238.         PrintPerson(&rec);
  239.     pdb->m_bAutoSeekNext = bPrev;
  240.  
  241.     PRINT_BLANK();
  242.     return TRUE;
  243. }
  244.  
  245. void CWCEDBDoc::PrintIndex(CCeDBDatabase* pdb) 
  246. {
  247.     WCHAR szBuf[20];
  248.     CString str;
  249.     str.LoadString(IDS_CURRENT_RECORD);
  250.     wsprintf(szBuf,(LPCTSTR)str,pdb->GetCurrIndex());
  251.     PRINT_WSTR(szBuf);
  252. }
  253.  
  254. void CWCEDBDoc::PrintPerson(CCeDBRecord* prec) 
  255. {
  256.     CCeDBProp *pPropLast,*pPropFirst,*pPropAge,*pPropGender;
  257.     WCHAR szBuf[200];
  258.  
  259.     pPropLast   = prec->GetPropFromIdent(PROP_LASTNAME);
  260.     pPropFirst  = prec->GetPropFromIdent(PROP_FIRSTNAME);
  261.     pPropAge    = prec->GetPropFromIdent(PROP_AGE);
  262.     pPropGender = prec->GetPropFromIdent(PROP_GENDER);
  263.  
  264.     CString str, str2;
  265.     str.LoadString(IDS_AGE_GENDER);
  266.     str2.LoadString(IDS_QUESTION);
  267.     wsprintf(szBuf,(LPCTSTR)str,
  268.              pPropLast?   pPropLast->GetString()   : (LPCTSTR)str2,
  269.              pPropFirst?  pPropFirst->GetString()  : (LPCTSTR)str2,
  270.              pPropAge?    pPropAge->GetUShort()    : 999,
  271.              pPropGender? pPropGender->GetUShort() : '?');
  272.     PRINT_WSTR(szBuf);        
  273. }
  274.  
  275.  
  276. void CWCEDBDoc::OnFileClear() 
  277. {
  278.     Output.RemoveAll();
  279.     UpdateAllViews(NULL);
  280.     CCeDBProp DBassign;
  281. }
  282.  
  283.  
  284.  
  285. void CWCEDBDoc::OnFileBasicTests()
  286. {
  287.     START;
  288.  
  289.     PRINT(IDS_BASIC_TEST);
  290.     PRINT_BLANK();
  291.  
  292.     PRINT(IDS_CHECK_TEST);
  293.     //if(!CCeDBDatabase::Exists(_T("Test Database")))
  294.     CString str;
  295.     str.LoadString(IDS_DATABASE);
  296.     if(!CCeDBDatabase::Exists((LPCTSTR)str))
  297.         FAIL;
  298.     else
  299.     {
  300.         OK;
  301.         PRINT(IDS_OPENIT);
  302.         CCeDBDatabase temp;
  303.         if(temp.Open((LPCTSTR)str))
  304.             OK;
  305.         else 
  306.             FAIL_AND_EXIT;
  307.         PRINT(IDS_DELETEIT);
  308.         if(temp.Delete())
  309.             OK;
  310.         else
  311.             FAIL_AND_EXIT;
  312.     }
  313.  
  314.     PRINT(IDS_CREATING_TEST);
  315.  
  316.     CCeDBDatabase* pdb = new CCeDBDatabase; // use ptr to new
  317.  
  318.     if(!pdb->Create((LPCTSTR)str))
  319.         FAIL_AND_EXIT;
  320.     OK;
  321.  
  322.     PRINT(IDS_CHECK_EXIST);
  323.     if(CCeDBDatabase::Exists((LPCTSTR)str))
  324.         OK;
  325.     else
  326.         FAIL;
  327.  
  328.     PRINT(IDS_CLOSEIT);
  329.     pdb->Close();
  330.  
  331.     delete pdb;
  332.  
  333.     CCeDBDatabase db; // use auto
  334.  
  335.     PRINT(IDS_OPEN_AGAIN);
  336.     if(!db.Open((LPCTSTR)str))
  337.         FAIL_AND_EXIT;
  338.     OK;
  339.  
  340.     PRINT(IDS_DELETEIT);
  341.     db.Delete();
  342.  
  343.     PRINT_BLANK();
  344.     PRINT(IDS_DONE_BASIC);
  345. }
  346.  
  347.  
  348.  
  349.  
  350. void CWCEDBDoc::OnFileEnum() 
  351. {
  352.     START;
  353.     PRINT(IDS_ENUM_TEST);
  354.     PRINT_BLANK();
  355.  
  356.     // Create 3 databases, inside a new scope so the db's are closed at the end of it
  357.     {
  358.         CStringArray names;
  359.         CCeDBDatabase databases[3];    
  360.         names.Add(CString((LPCTSTR)IDS_HERE));
  361.         names.Add(CString((LPCTSTR)IDS_THERE));
  362.         names.Add(CString((LPCTSTR)IDS_NOWHERE));
  363.  
  364.         PRINT(IDS_CREATING_DB99);
  365.         for(int n=0; n < names.GetSize(); n++)
  366.         {
  367.             LPWSTR name = (LPWSTR)(LPCTSTR)names[n]; // blah!
  368.             if(CCeDBDatabase::Exists(name)) 
  369.             {
  370.                 CCeDBDatabase db;
  371.                 db.Open(name);
  372.                 db.Delete();
  373.             }
  374.  
  375.             CString printLine;
  376.             printLine.LoadString(IDS_CREATING);
  377.             printLine += name;
  378.             PRINT_WSTR(printLine);
  379.             if(!databases[n].Create(name,99))
  380.                 FAIL_AND_EXIT;
  381.             OK;
  382.  
  383.             PRINT(IDS_SLEEPING);
  384.             Sleep(500);
  385.         }
  386.  
  387.         // note that databases that go out of scope (i.e. destructed) get closed
  388.     }
  389.  
  390.     // First pass: p=0: enumerates the three databases
  391.     // Subsequent passes delete the three databases (in Windows CE 2.1, the object store
  392.     // stores the databases in a different order, so multiple passes is necessary).
  393.     int nDeleted = 0;
  394.     for(int p=0; nDeleted < 3; p++)
  395.     {
  396.         PRINT_BLANK();
  397.         if(!p)
  398.             PRINT(IDS_DOING_ENUM);
  399.         else
  400.             PRINT(IDS_DOING_ENUM99);
  401.  
  402.         CCeDBEnum dbEnumAll;
  403.         CCeDBEnum dbEnum(99);
  404.         CEOID CEOID;
  405.     
  406.         while(CEOID = (p?dbEnum.Next():dbEnumAll.Next()))
  407.         {
  408.             CCeDBDatabase db;
  409.             WCHAR szBuf[200];
  410.  
  411.             CString str;
  412.             str.LoadString(IDS_FOUND_DB);
  413.             wsprintf(szBuf,(LPCTSTR)str,CEOID);
  414.             PRINT_WSTR(szBuf);            
  415.  
  416.             if(!db.Open(CEOID))
  417.                 FAIL_AND_EXIT;
  418.  
  419.             WCHAR szName[33];
  420.             db.GetName(szName);
  421.  
  422.             FILETIME FileTime = db.GetLastModified();
  423.             SYSTEMTIME SystemTime;
  424.             FileTimeToSystemTime(&FileTime, &SystemTime);
  425.  
  426.             str.LoadString(IDS_NAME_SIZE);
  427.             wsprintf(szBuf,(LPCTSTR)str,
  428.                      szName,db.GetSize(),db.GetIdent(),
  429.                      SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond, 
  430.                      SystemTime.wMilliseconds);
  431.             PRINT_WSTR(szBuf);
  432.  
  433.             if(p)
  434.             {
  435.                 PRINT(IDS_ENUM_DELETE);
  436.                 db.Delete();
  437.                 nDeleted++;
  438.             }
  439.         }
  440.     }
  441.  
  442.     PRINT(IDS_ENUM_DONE);
  443. }
  444.  
  445.  
  446.  
  447. void CWCEDBDoc::OnFileSortTest() 
  448. {
  449.     START;
  450.     PRINT(IDS_SORT_TEST);
  451.     PRINT_BLANK();
  452.  
  453.     if(!GeneratePeopleDB())
  454.         FAIL_AND_EXIT;
  455.     OK;
  456.  
  457.  
  458.     PRINT(IDS_PRINT_DEFAULT);
  459.  
  460.     CCeDBDatabase db;
  461.     if(db.Open(DB_NAME_PEOPLE))
  462.         PrintPeopleDB(&db);
  463.     db.Close();
  464.  
  465.     PRINT(IDS_NOTE);
  466.     
  467.  
  468.     PRINT_BLANK();
  469.     PRINT(IDS_PRINT_AGE);
  470.  
  471.     // Note: the property has to match on both the type and the identifier in 
  472.     // order for the Open() to work!
  473.     CCeDBProp Age(CCeDBProp::Type_UShort,PROP_AGE); 
  474.     if(db.Open(DB_NAME_PEOPLE,&Age))
  475.         PrintPeopleDB(&db);
  476.     db.Close();
  477.  
  478.  
  479.     PRINT_BLANK();
  480.     PRINT(IDS_PRINT_GENDER);
  481.  
  482.     CCeDBProp Gender(CCeDBProp::Type_UShort,PROP_GENDER); 
  483.     if(db.Open(DB_NAME_PEOPLE,&Gender))
  484.         PrintPeopleDB(&db);
  485.     db.Close();
  486.  
  487.  
  488.     PRINT_BLANK();
  489.     PRINT(IDS_CHANGE_FIRST);
  490.     PRINT(IDS_PRIMARY_NOTE);
  491.  
  492.     if(db.Open(DB_NAME_PEOPLE))
  493.     {
  494.         CCeDBProp sortProps[4];
  495.         int nNumSortProps;
  496.         db.GetSortProps(&nNumSortProps,sortProps);
  497.         sortProps[0].SetSortFlags(CCeDBProp::Sort_Descending);
  498.         db.SetSortProps(nNumSortProps,sortProps);
  499.     }
  500.     db.Close();
  501.  
  502.     CCeDBProp LastName(CCeDBProp::Type_String,PROP_LASTNAME); 
  503.     if(db.Open(DB_NAME_PEOPLE,&LastName))
  504.         PrintPeopleDB(&db);
  505.     db.Close();
  506. }
  507.  
  508.  
  509.  
  510.  
  511.  
  512. void CWCEDBDoc::OnFileSeekTest() 
  513. {
  514.     START;
  515.     PRINT(IDS_SEEK_TEST);
  516.     PRINT_BLANK();
  517.  
  518.     if(!GeneratePeopleDB())
  519.         FAIL_AND_EXIT;
  520.     OK;
  521.  
  522.     CCeDBDatabase db;
  523.     if(!db.Open(DB_NAME_PEOPLE))
  524.         FAIL_AND_EXIT;
  525.  
  526.     CCeDBRecord rec;
  527.  
  528.     PRINT_BLANK();
  529.     PRINT(IDS_SEEK_FIRST);
  530.     if(!db.SeekFirst() || !db.ReadCurrRecord(&rec))
  531.         FAIL_AND_EXIT;
  532.     PrintIndex(&db);
  533.     PrintPerson(&rec);
  534.  
  535.     PRINT_BLANK();
  536.     PRINT(IDS_SEEK_LAST);
  537.     if(!db.SeekLast() || !db.ReadCurrRecord(&rec))
  538.         FAIL_AND_EXIT;
  539.     PrintIndex(&db);
  540.     PrintPerson(&rec);
  541.  
  542.     PRINT_BLANK();
  543.     PRINT(IDS_SEEK_SECOND);
  544.     if(!db.SeekToIndex(1) || !db.ReadCurrRecord(&rec)) // 0-based indexing!
  545.         FAIL_AND_EXIT;
  546.     PrintIndex(&db);
  547.     PrintPerson(&rec);
  548.  
  549.     PRINT_BLANK();
  550.     PRINT(IDS_REMEMBERING);
  551.     CEOID poid = db.GetCurrRecord();
  552.  
  553.     PRINT_BLANK();    
  554.     PRINT(IDS_SECOND);
  555.     if(!db.SeekToIndex(1,TRUE) || !db.ReadCurrRecord(&rec)) // 0-based indexing!
  556.         FAIL_AND_EXIT;
  557.     PrintIndex(&db);
  558.     PrintPerson(&rec);
  559.  
  560.     PRINT_BLANK();
  561.     PRINT(IDS_SEEK_PREV);
  562.     if(!db.SeekPrev() || !db.ReadCurrRecord(&rec)) 
  563.         FAIL_AND_EXIT;
  564.     PrintIndex(&db);
  565.     PrintPerson(&rec);
  566.  
  567.     PRINT_BLANK();
  568.     PRINT(IDS_REMEMBERED);
  569.     if(!db.SeekToRecord(poid) || !db.ReadCurrRecord(&rec)) 
  570.         FAIL_AND_EXIT;
  571.     PrintIndex(&db);
  572.     PrintPerson(&rec);
  573.  
  574.     CString str;
  575.     str.LoadString(IDS_SMITH);
  576.     CCeDBProp lastName((LPWSTR)(LPCTSTR)str,PROP_LASTNAME);
  577.  
  578.     PRINT_BLANK();
  579.     PRINT(IDS_FIRST_SMITH);
  580.     if(!db.SeekFirstEqual(lastName) || !db.ReadCurrRecord(&rec)) 
  581.         FAIL_AND_EXIT;
  582.     PrintIndex(&db);
  583.     PrintPerson(&rec);
  584.  
  585.     PRINT_BLANK();
  586.     PRINT(IDS_NEXT_SMITH);
  587.     if(!db.SeekNextEqual(lastName) || !db.ReadCurrRecord(&rec)) 
  588.         FAIL_AND_EXIT;
  589.     PrintIndex(&db);
  590.     PrintPerson(&rec);
  591.  
  592.     PRINT_BLANK();
  593.     PRINT(IDS_NEXT_SMITH2);
  594.     if(!db.SeekNextEqual(lastName) || !db.ReadCurrRecord(&rec)) 
  595.         PRINT(IDS_NOT_FOUND);
  596.     
  597.     PRINT_BLANK();
  598.     PRINT(IDS_PREV_EVANS);
  599.     str.LoadString(IDS_EVANS);    
  600.     CCeDBProp propLarger((LPWSTR)(LPCTSTR)str,PROP_LASTNAME);
  601.     if(!db.SeekValueSmaller(propLarger) || !db.ReadCurrRecord(&rec)) 
  602.         FAIL_AND_EXIT;
  603.     PrintIndex(&db);
  604.     PrintPerson(&rec);
  605.  
  606.     // Reset propLarger to be the current property.
  607.     propLarger.SetString(rec.GetPropFromIdent(PROP_LASTNAME)->GetString());
  608.     if(!db.SeekValueSmaller(propLarger) || !db.ReadCurrRecord(&rec)) 
  609.         FAIL_AND_EXIT;
  610.     PrintIndex(&db);
  611.     PrintPerson(&rec);
  612.  
  613.     PRINT_BLANK();
  614.     PRINT(IDS_NEXT_EVANS);
  615.     str.LoadString(IDS_EVANS);
  616.     CCeDBProp propSmaller((LPWSTR)(LPCTSTR)str,PROP_LASTNAME);
  617.     if(!db.SeekValueGreater(propSmaller) || !db.ReadCurrRecord(&rec)) 
  618.         FAIL_AND_EXIT;
  619.     PrintIndex(&db);
  620.     PrintPerson(&rec);
  621.  
  622.     PRINT_BLANK();
  623.     PRINT(IDS_DONE);
  624. }
  625.  
  626. void CWCEDBDoc::OnFileModifyTest() 
  627. {
  628.     START;
  629.     PRINT(IDS_MODIFY_TEST);
  630.     
  631.     if(!GeneratePeopleDB())
  632.         FAIL_AND_EXIT;
  633.     OK;
  634.  
  635.     PRINT_BLANK();
  636.     PRINT(IDS_MODIFY_INITIAL);
  637.     CCeDBDatabase db;
  638.     if(db.Open(DB_NAME_PEOPLE))
  639.         PrintPeopleDB(&db);
  640.     db.SeekFirst();
  641.     PRINT_BLANK();
  642.     PRINT(IDS_MODIFY_AGE);
  643.     CCeDBRecord rec;
  644.     CString str;
  645.     str.LoadString(IDS_CABANA);
  646.     CCeDBProp prop((LPWSTR)(LPCTSTR)str,PROP_LASTNAME);
  647.     if(!db.SeekFirstEqual(prop))
  648.         FAIL_AND_EXIT;
  649.     if(!db.ReadCurrRecord(&rec)) 
  650.         FAIL_AND_EXIT;    
  651.     CCeDBProp* pAge = rec.GetPropFromIdent(PROP_AGE);
  652.     if(pAge == NULL)
  653.         FAIL_AND_EXIT;
  654.     pAge->SetUShort(20);
  655.     CCeDBProp ageFilter(CCeDBProp::Type_UShort,PROP_AGE);
  656.     db.WriteCurrRecord(&rec,1,&ageFilter);
  657.     PrintPeopleDB(&db);
  658. }
  659.     
  660.  
  661. void CWCEDBDoc::OnFileDeletionTest() 
  662. {
  663.     START;
  664.     PRINT(IDS_DELETION_TEST);
  665.  
  666.     if(!GeneratePeopleDB())
  667.         FAIL_AND_EXIT;
  668.     OK;
  669.  
  670.     PRINT_BLANK();
  671.     PRINT(IDS_INITIAL);
  672.     CCeDBDatabase db;
  673.     if(db.Open(DB_NAME_PEOPLE))
  674.         PrintPeopleDB(&db);
  675.  
  676.     PRINT_BLANK();
  677.     PRINT(IDS_RECORD);
  678.     db.SeekToIndex(1);
  679.     if(!db.DeleteCurrRecord())
  680.         FAIL_AND_EXIT;
  681.     PrintPeopleDB(&db);
  682.     
  683.     PRINT_BLANK();
  684.     
  685.     PRINT(IDS_DELETE_FIRST);
  686.     CCeDBProp props[] = {
  687.         CCeDBProp(CCeDBProp::Type_String,PROP_FIRSTNAME),
  688.         CCeDBProp(CCeDBProp::Type_UShort,PROP_GENDER) 
  689.     };
  690.  
  691.     db.SeekToIndex(2);
  692.     if(!db.DeleteCurrRecordProps(2,props))
  693.         FAIL_AND_EXIT;
  694.     PrintPeopleDB(&db);
  695.  
  696.     PRINT(IDS_DELETE_LAST);
  697.     CCeDBProp props2[] = {
  698.         CCeDBProp(CCeDBProp::Type_String,PROP_LASTNAME) 
  699.     };
  700.  
  701.     db.SeekToIndex(1);
  702.     if(!db.DeleteCurrRecordProps(1,props2))
  703.         FAIL_AND_EXIT;
  704.     PrintPeopleDB(&db);
  705.  
  706.  
  707. }
  708.  
  709.  
  710.